package com.study.listener;

import org.springframework.stereotype.Component;

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import java.util.TimerTask;
import java.util.Timer;

@Component
public class TimeTaskListener implements ServletContextListener{  //当Servlet 容器启动或终止Web 应用时，会触发ServletContextEvent 事件
    private java.util.Timer timer = null;

    /**
     * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后，容器再对Filter 初始化，
     * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
     */
    public void contextInitialized(ServletContextEvent event) {
        TimerTask task = new TimerTask() {
            public void run() {
                System.out.println("Hi");
            }
        };
        timer = new Timer();
        event.getServletContext().log("定时器已启动");
        timer.schedule(task, 0, 5000);
        event.getServletContext().log("已经添加计划任务");
    }

    /**
     * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前，容器会先销毁所有的Servlet 和Filter 过滤器。
     */
    public void contextDestroyed(ServletContextEvent event) {
        timer.cancel();
        event.getServletContext().log("定时器已关闭");
    }
}  //定时器就运行在整个Web工程的生命期里了

/*
介绍 ServletContextListener 的用法。
例一：在服务启动时，将数据库中的数据加载进内存，并将其赋值给一个属性名，其它的 Servlet 就可以通过 getAttribute 进行属性值的访问。

例二：书写一个类用于统计当Web 应用启动后，网页被客户端访问的次数。如果重新启动Web 应用，计数器不会重新从1 开始统计访问次数，而是从上次统计的结果上进行累加。
 */